package dao;

import entity.IEntity;
import entity.Profesor;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.NonUniqueResultException;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaQuery;
import vo.IValueObject;
import vo.ProfesorVO;

/**
 *
 * @author Alexander
 */
public class ProfesorDAO implements IDAO {

    @Override
    public void persist(IEntity entity, EntityManager em) {
        em.persist(entity);
    }

    @Override
    public IValueObject find(Object id, EntityManager em) {
        Profesor p = (Profesor) em.find(Profesor.class, (int) id);
        if (p != null) {
            return p.toVO();
        } else {
            return null;
        }
    }

    @Override
    public void update(IEntity entity, EntityManager em) {
        em.merge(entity);
    }

    @Override
    public void delete(Object id, EntityManager em) {
        Profesor prof = em.getReference(Profesor.class, (String) id);
        em.remove(prof);
    }

    @Override
    public List<IValueObject> getList(EntityManager em) {
        List<IValueObject> profVO = new ArrayList<>();
        CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
        cq.select(cq.from(Profesor.class));
        Query q = em.createQuery(cq);
        for(Object profesores : q.getResultList()){
            profVO.add(((Profesor)profesores).toVO());
        }
        return profVO;
    }

    public ProfesorVO findByName(String nombre, String apellido, EntityManager em) {
        ProfesorVO profeVo = null;
        Query q = em.createQuery("SELECT p from Profesor p " +
                "WHERE p.nombre LIKE :nombre" +
                " AND p.apellido LIKE :apellido").setParameter("nombre", nombre).setParameter("apellido", apellido);
        try {
            profeVo = ((Profesor) q.getSingleResult()).toVO();
        } catch (NonUniqueResultException e) {
            profeVo = ((Profesor) q.getResultList().get(0)).toVO();
        }
        return profeVo;
    }
}
